package business;

import java.util.ArrayList;
import java.util.Iterator;

import persistence.db.DataSet;
import persistence.model.AbstractModel;
import persistence.model.Salle;
import persistence.model.Seance;
import persistence.model.SeanceSpeciale;
import utility.Record;

public class SalleBL {
	
	private Salle salle = null;
	ArrayList<String> listeErreurs = null;

	public SalleBL(){
	}
	
	public SalleBL(int id){
		salle = (Salle) Salle.all().get(id);
	}

	/**
	 * @return une liste de record
	 * chaque record comprenant le nom de la salle ainsi que son id
	 */
	public ArrayList<Record> getListeSalle()
	{
		ArrayList<Record> listeSalle = new ArrayList<Record>();
		for (AbstractModel salle : Salle.all())
		{
			Salle salleCourant = (Salle)salle;
			
			int idSalle = salleCourant.getId();
			String nomSalle = salleCourant.getNomSalle();
			
			listeSalle.add(new Record(idSalle, nomSalle));
		}
		
		return listeSalle;
	}

	
	
	/**
	 * @return retourne si la demande d'ajout ou de modification est valide ou non
	 */
	public boolean estValidePourModif(String ancienNom){
		boolean estValide = true;
		boolean existeDeja = false;
		
		if (!ancienNom.equals(salle.getNomSalle())) {
			for (AbstractModel s : Salle.all())
			{
				Salle sCourant = (Salle)s;
				if (sCourant.getNomSalle().equals(salle.getNomSalle())) {
					existeDeja = true;
					estValide = false;
				}
			}
		}
		if (existeDeja) {
			listeErreurs.add("Cette salle existe deja.");
		}
		if (salle.getNomSalle().length()>3) {
			listeErreurs.add("Le nom de la salle est trop long. Il peut contenir jusquà 3 lettres.");
			estValide = false;
		}
		if (salle.getCapaciteSalle() < 0) {
			listeErreurs.add("La capacité de la salle doit être supérieure à zéro.");
			estValide = false;
		}
		System.out.println(listeErreurs);
		return estValide;
	}
	
	public boolean estValidePourAjout(){
		boolean estValide = true;
		boolean existeDeja = false;
		
			for (AbstractModel s : Salle.all())
			{
				Salle sCourant = (Salle)s;
				if (sCourant.getNomSalle().equals(salle.getNomSalle())) {
					existeDeja = true;
					estValide = false;
				}
			}
		if (existeDeja) {
			listeErreurs.add("Cette salle existe deja.");
		}
		if (salle.getNomSalle().length()>3) {
			listeErreurs.add("Le nom de la salle est trop long. Il peut contenir jusquà 3 lettres.");
			estValide = false;
		}
		if (salle.getCapaciteSalle() < 0) {
			listeErreurs.add("La capacité de la salle doit être supérieure à zéro.");
			estValide = false;
		}
		System.out.println(listeErreurs);
		return estValide;
	}

	/**
	 * @return retourne si la demande de suppression est valide ou non
	 */
	public boolean estValidePourSuppr(){
		boolean estValide = true;
		/* Ensemble des réservations de la salle*/
		DataSet seanceSet = Seance.all().filter("fk_seance_salle = " + salle.getId());
		DataSet seanceSpeSet = SeanceSpeciale.all().filter("fk_seance_spe_salle = " + salle.getId());
		/*Ensemble des réservation futures, càd supperieur à la date du jour */
		Iterator<AbstractModel> it = seanceSet.iterator();
		if (it.hasNext()) {
			/* il existe un see concernant ce type d'enseignement */
			estValide = false;
		}
		it = seanceSpeSet.iterator();
		if (it.hasNext()) {
			/* il existe un see concernant ce type d'enseignement */
			estValide = false;
		}
		if (! estValide) {
			listeErreurs.add("Il y a au moins une réservation pour cette salle.");
		}
		System.out.println(listeErreurs);
		return estValide;
	}

	/**
	 * @param id : identifiant de la salle
	 * @param nom : nom de la salle
	 * @param capacite : capacité (nombre de sièges total) de la salle
	 * @param liste d'erreurs rencontrées
	 */
	public void ajouterSalle(int id, String nom, int capacite) {
		salle = new Salle(id, nom, capacite);
		listeErreurs = new ArrayList<String>();
		if (this.estValidePourAjout()) {
			salle.save();
		}
	}
	
	/**
	 * @param id : identifiant de la salle
	 * @param nom : nom de la salle
	 * @param capacite : capacité (nombre de sièges total) de la salle
	 * @param liste d'erreurs rencontrées
	 */
	public void modifierSalle(int id, String nom, int capacite, String ancienNom) {
		salle = new Salle(id, nom, capacite);
		listeErreurs = new ArrayList<String>();
		if (this.estValidePourModif(ancienNom)) {
			salle.save(id);
		}
	}
	
	/**
	 * @param id : identifiant de la salle
	 * @param nom : nom de la salle
	 * @param capacite : capacité (nombre de sièges total) de la salle
	 * @param liste d'erreurs rencontrées
	 */
	public void supprimerSalle() {
		listeErreurs = new ArrayList<String>();
		if (this.estValidePourSuppr()) {
			salle.delete();
		}
	}
	
	/* Ensemble des getters et setters -> delegation vers la persistance */
	public int getId() {
		return salle.getId();
	}

	public void setId(int idSalle) {
		salle.setId(idSalle);
	}

	public String getNomSalle() {
		return salle.getNomSalle();
	}

	public void setNomSalle(String nomSalle) {
		salle.setNomSalle(nomSalle);
	}

	public int getCapaciteSalle() {
		return salle.getCapaciteSalle();
	}

	public void setCapaciteSalle(int capaciteSalle) {
		salle.setCapaciteSalle(capaciteSalle);
	}	
	
	/**
	 * Accés à toutes les séances de la periode pour la salle courant
	 * @param periode souhaitée
	 * @return ArrayListe de seance correspondant
	 */

	public ArrayList<SeanceBL> getListeSeances(int idPeriode) {
		ArrayList<SeanceBL> resultSeance = new ArrayList<SeanceBL>();
		for (AbstractModel seance : Seance.all().filter("fk_seance_periode = " + idPeriode))
		{
			Salle salle = ((Seance)seance).getSalle();
			if(salle.getId() == this.getId()){
				resultSeance.add(new SeanceBL((Seance) seance));
			}
		}
		return resultSeance;
	}		
	
	public ArrayList<SeanceSpecialeBL> getListeSeancesSpeciale(int idPeriode) {
		ArrayList<SeanceSpecialeBL> resultSeanceSpeciale = new ArrayList<SeanceSpecialeBL>();
		for (AbstractModel seanceSpeciale : SeanceSpeciale.all().filter("fk_seance_spe_periode = " + idPeriode))
		{
			Salle salle = ((SeanceSpeciale)seanceSpeciale).getSalle();
			if(salle.getId() == this.getId()){
				resultSeanceSpeciale.add(new SeanceSpecialeBL((SeanceSpeciale) seanceSpeciale));
			}
		}
		return resultSeanceSpeciale;
	}
	
}
